#ifndef FILA_CPP
#define FILA_CPP

#include <sys/time.h>
#include <iostream>
#include <cstdlib>
#include <vector>
#include <math.h>
#include "individuo.cpp"

using namespace std;


class Filas{
private:
	double tempoTranscorrido;
	float lambida;
	vector <Individuo> fila1;
	vector <Individuo> fila2;
	vector<Individuo> listaIndividuo;
	unsigned long semente;
	struct drand48_data bufferGeradorAleatorio;
	//double randomico;

public:

	Filas(float lambida):lambida(lambida){
		tempoTranscorrido = 0;
///		randomico = 0;
		initSemente();


	}
	void initSemente(){
		//if(randomico == 0)
		//{
			struct timeval temp;
			gettimeofday(&temp, NULL);
			semente = temp.tv_usec;

		//}
		//else
		//{
		//	semente = randomico;
		//}

		srand48_r(semente, &bufferGeradorAleatorio);

	}

	void geraIndividuos(int cor=-1) {


		double resultado = 0;
		double randomico = 0;


		while (randomico == 0 || randomico == 1)
		{
			drand48_r(&bufferGeradorAleatorio, &randomico);
		}

		resultado = (-1) * ((log(1 - randomico)) / lambida);

		tempoTranscorrido += resultado;
		Individuo i(tempoTranscorrido, 1, cor);
		listaIndividuo.push_back(i);
	}
	Individuo getLastIndividuoFila1(){
		return fila1.back();
	}

	Individuo removeFirstIndividuoFila1(){
		Individuo temp(fila1.front());
		fila1.erase(fila1.begin());
		return temp;
	}

	Individuo removeFirstIndividuoFila2(){
		Individuo temp(fila2.front());
		fila2.erase(fila2.begin());
		return temp;
	}

	float getTempoProximaChegadaFila1(){
		return listaIndividuo.front().getTempoChegadaFila1();
	}

	int sizeFila1(){
		return (int) fila1.size();
	}

	int sizeFila2(){
		return (int) fila2.size();
	}

	void chegadaFila1(){
		if(listaIndividuo.size() > 0){
			fila1.push_back(listaIndividuo.front());
			listaIndividuo.erase(listaIndividuo.begin());
		}

	}

	void chegadaFila2(Individuo i){
		fila2.push_back(i);
	}

	void retornaFila2(Individuo i){
		fila2.insert(fila2.begin(), i);
	}
};
#endif
